// https://www.luogu.com.cn/problem/P3916

#include <iostream>
#include <vector>
using namespace std;

vector<vector<int>> reverseGraph(100010);  // 反向图
vector<int> ans(100010, 0);                // 存储每个点能到达的最大编号节点

// 在反向图上进行DFS：从当前点cur出发，标记所有能到达的点，它们的答案都是 maxId
void dfs(int cur, int maxId, vector<bool>& visited) {
    if (visited[cur]) return;  // 如果已经访问过，直接返回

    visited[cur] = true;       // 标记为已访问
    ans[cur] = maxId;          // 当前点能到达的最大编号就是 maxId（因为是从大编号点开始DFS的）

    // 遍历反向图中的邻居（在原图中这些点是能到达当前点的）
    for (int i = 0; i < reverseGraph[cur].size(); i++) {
        int neighbor = reverseGraph[cur][i];
        if (!visited[neighbor]) {
            dfs(neighbor, maxId, visited);  // 继续DFS标记
        }
    }
}

int main() {
    int n, m, t1, t2;
    scanf("%d%d", &n, &m);

    // 构建反向图：原图中t1->t2，反向图中就是t2->t1
    for (int i = 0; i < m; i++) {
        scanf("%d%d", &t1, &t2);
        reverseGraph[t2].push_back(t1);  // 注意这里是t2->t1
    }

    vector<bool> visited(n + 1, false);  // 访问标记数组

    // 关键：从大到小遍历每个点
    for (int i = n; i >= 1; i--) {
        // 如果这个点还没被访问过，说明它是当前能找到的编号最大的点之一
        // 从它开始在反向图上DFS，标记所有能到达的点
        if (!visited[i]) {
            dfs(i, i, visited);
        }
    }

    // 输出结果
    for (int i = 1; i <= n; i++) {
        printf("%d ", ans[i]);
    }

    return 0;
}